import axios from 'axios'
import store from '../store'
import { ElMessage } from 'element-plus'

// 创建axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API || '/api', // API基础URL
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json;charset=utf-8'
  }
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在请求发送之前做些什么
    const token = localStorage.getItem('token')
    if (token) {
      // 让每个请求携带token
      config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
  },
  error => {
    // 对请求错误做些什么
    console.error('request error:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 对响应数据做点什么
    const res = response.data
    
    // 根据后端返回的数据结构，这里需要调整
    // 后端返回的是 { success: true, data: {}, message: '' } 格式
    // 对于分页接口，后端返回 { success: true, data: [], total: 100, current: 1, size: 10 }
    if (res && typeof res === 'object' && res.success !== undefined) {
      if (!res.success) {
        // 非success的处理
        const errorMsg = res.message || '请求失败'
        ElMessage.error(errorMsg)
        return Promise.reject(new Error(errorMsg))
      }
      // 返回完整的响应数据，包括分页信息（total、current、size等）
      // 前端组件需要这些信息来正确显示分页
      return res
    }
    
    // 如果返回的是直接的数据（如数组、对象），直接返回
    return res
  },
  error => {
    // 对响应错误做点什么
    console.error('response error:', error)
    
    // 处理token过期或无效的情况
    if (error.response && error.response.status === 401) {
      // 清除token和用户信息
      store.commit('user/LOGOUT', null, { root: true })
      // 重定向到登录页
      window.location.href = '/login'
      ElMessage.error('登录已过期，请重新登录')
      return Promise.reject(new Error('登录已过期'))
    }
    
    // 处理其他错误
    const errorMsg = error.response?.data?.message || error.message || '网络错误'
    ElMessage.error(errorMsg)
    return Promise.reject(error)
  }
)

// 导出请求方法
export default {
  /**
   * GET请求
   * @param {string} url - 请求URL
   * @param {object} params - 请求参数
   * @returns {Promise}
   */
  get(url, params = {}) {
    return service({
      url,
      method: 'get',
      params
    })
  },
  
  /**
   * POST请求
   * @param {string} url - 请求URL
   * @param {object} data - 请求数据
   * @returns {Promise}
   */
  post(url, data = {}) {
    return service({
      url,
      method: 'post',
      data
    })
  },
  
  /**
   * PUT请求
   * @param {string} url - 请求URL
   * @param {object} data - 请求数据
   * @returns {Promise}
   */
  put(url, data = {}) {
    return service({
      url,
      method: 'put',
      data
    })
  },
  
  /**
   * DELETE请求
   * @param {string} url - 请求URL
   * @param {object} params - 请求参数
   * @returns {Promise}
   */
  delete(url, params = {}) {
    return service({
      url,
      method: 'delete',
      params
    })
  },
  
  /**
   * 上传文件
   * @param {string} url - 请求URL
   * @param {FormData} formData - 表单数据
   * @returns {Promise}
   */
  upload(url, formData) {
    return service({
      url,
      method: 'post',
      data: formData,
      headers: {
        'Content-Type': 'multipart/form-data'
      },
      timeout: 30000 // 上传文件超时时间设为30秒
    })
  }
}